#include "IdxMasterfile.h"
#include <cstring>

IdxMasterfile::IdxMasterfile(const char* pathId, const char* pathMF) : indice(pathId),
	pathMF(pathMF),masterFile(pathMF, ios::in | ios::out | ios::binary)
{
	if (!masterFile.is_open())
	{
		masterFile.open(pathMF, ios::out | ios::binary);
		masterFile.close();
		masterFile.open(pathMF, ios::in | ios::out | ios::binary );
		if (!masterFile.is_open()) throw std::ios_base::failure("No pudo ni accederse ni crearse el archivo masterfile.");
	}
}


size_t IdxMasterfile::agregar(RegistroMF &reg)
{
	masterFile.seekg(0,ios::end);
	size_t pos = masterFile.tellg();
	char* regBytes;
	size_t tam = reg.serializar(regBytes);
	masterFile.write((char*)&tam, B_POS);
	masterFile.write(regBytes, tam);
	delete[] regBytes;
	size_t id = indice.agregar(pos);
	return id;
}

void IdxMasterfile::recuperar(unsigned int idx, RegistroMF &reg)
{
	size_t pos = indice.devolver(idx);
	size_t tam = 0;
	masterFile.seekg(pos);
	masterFile.read((char*)&tam, B_POS);
	char* buffer = new char[tam];
	masterFile.seekg(pos+B_POS);
	masterFile.read(buffer, tam);
	reg.cargar(buffer, tam);
	delete[] buffer;
}

void IdxMasterfile::recrearArchivos()
{
	indice.recrearArchivo();
	masterFile.close();
	masterFile.open(pathMF.c_str(), ios::in | ios::out | ios::trunc | ios::binary );
	if(!masterFile.is_open())
	{
		throw std::ios_base::failure("No pudo recrearse el archivo Indice.");
	}
}

IdxMasterfile::~IdxMasterfile()
{
	masterFile.close();
	//Nota: El indice se cierra al ser destruido
}
